1 // DerelictCL - a Derelict based dynamic binding for OpenCL
2 // written in the D programming language
3 //
4 // Copyright: MeinMein 2013-2014.
5 // License:   Boost License 1.0
6 //            (See accompanying file LICENSE_1_0.txt or copy at
7 //             http://www.boost.org/LICENSE_1_0.txt)
8 // Authors:   Gerbrand Kamphuis (meinmein.com),
9 //            Marvin Meeng (meinmein.com).
10 module derelict.opencl.constants;
11 
12 import derelict.opencl.types;
13 
14 // cl.h
15 
16 // Error Codes
17 enum
18 {
19     CL_SUCCESS                                  = 0,
20     CL_DEVICE_NOT_FOUND                         = -1,
21     CL_DEVICE_NOT_AVAILABLE                     = -2,
22     CL_COMPILER_NOT_AVAILABLE                   = -3,
23     CL_MEM_OBJECT_ALLOCATION_FAILURE            = -4,
24     CL_OUT_OF_RESOURCES                         = -5,
25     CL_OUT_OF_HOST_MEMORY                       = -6,
26     CL_PROFILING_INFO_NOT_AVAILABLE             = -7,
27     CL_MEM_COPY_OVERLAP                         = -8,
28     CL_IMAGE_FORMAT_MISMATCH                    = -9,
29     CL_IMAGE_FORMAT_NOT_SUPPORTED               = -10,
30     CL_BUILD_PROGRAM_FAILURE                    = -11,
31     CL_MAP_FAILURE                              = -12,
32     CL_MISALIGNED_SUB_BUFFER_OFFSET             = -13,
33     CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST= -14,
34     CL_COMPILE_PROGRAM_FAILURE                  = -15,
35     CL_LINKER_NOT_AVAILABLE                     = -16,
36     CL_LINK_PROGRAM_FAILURE                     = -17,
37     CL_DEVICE_PARTITION_FAILED                  = -18,
38     CL_KERNEL_ARG_INFO_NOT_AVAILABLE            = -19,
39 
40     CL_INVALID_VALUE                            = -30,
41     CL_INVALID_DEVICE_TYPE                      = -31,
42     CL_INVALID_PLATFORM                         = -32,
43     CL_INVALID_DEVICE                           = -33,
44     CL_INVALID_CONTEXT                          = -34,
45     CL_INVALID_QUEUE_PROPERTIES                 = -35,
46     CL_INVALID_COMMAND_QUEUE                    = -36,
47     CL_INVALID_HOST_PTR                         = -37,
48     CL_INVALID_MEM_OBJECT                       = -38,
49     CL_INVALID_IMAGE_FORMAT_DESCRIPTOR          = -39,
50     CL_INVALID_IMAGE_SIZE                       = -40,
51     CL_INVALID_SAMPLER                          = -41,
52     CL_INVALID_BINARY                           = -42,
53     CL_INVALID_BUILD_OPTIONS                    = -43,
54     CL_INVALID_PROGRAM                          = -44,
55     CL_INVALID_PROGRAM_EXECUTABLE               = -45,
56     CL_INVALID_KERNEL_NAME                      = -46,
57     CL_INVALID_KERNEL_DEFINITION                = -47,
58     CL_INVALID_KERNEL                           = -48,
59     CL_INVALID_ARG_INDEX                        = -49,
60     CL_INVALID_ARG_VALUE                        = -50,
61     CL_INVALID_ARG_SIZE                         = -51,
62     CL_INVALID_KERNEL_ARGS                      = -52,
63     CL_INVALID_WORK_DIMENSION                   = -53,
64     CL_INVALID_WORK_GROUP_SIZE                  = -54,
65     CL_INVALID_WORK_ITEM_SIZE                   = -55,
66     CL_INVALID_GLOBAL_OFFSET                    = -56,
67     CL_INVALID_EVENT_WAIT_LIST                  = -57,
68     CL_INVALID_EVENT                            = -58,
69     CL_INVALID_OPERATION                        = -59,
70     CL_INVALID_GL_OBJECT                        = -60,
71     CL_INVALID_BUFFER_SIZE                      = -61,
72     CL_INVALID_MIP_LEVEL                        = -62,
73     CL_INVALID_GLOBAL_WORK_SIZE                 = -63,
74     CL_INVALID_PROPERTY                         = -64,
75     CL_INVALID_IMAGE_DESCRIPTOR                 = -65,
76     CL_INVALID_COMPILER_OPTIONS                 = -66,
77     CL_INVALID_LINKER_OPTIONS                   = -67,
78     CL_INVALID_DEVICE_PARTITION_COUNT           = -68,
79 }
80 
81 // cl_bool
82 enum
83 {
84     CL_FALSE                                    = 0,
85     CL_TRUE                                     = 1,
86     CL_BLOCKING                                 = CL_TRUE,
87     CL_NON_BLOCKING                             = CL_FALSE
88 }
89 
90 // cl_platform_info
91 enum
92 {
93     CL_PLATFORM_PROFILE                         = 0x0900,
94     CL_PLATFORM_VERSION                         = 0x0901,
95     CL_PLATFORM_NAME                            = 0x0902,
96     CL_PLATFORM_VENDOR                          = 0x0903,
97     CL_PLATFORM_EXTENSIONS                      = 0x0904,
98 }
99 
100 // cl_device_type - bitfield
101 enum : cl_bitfield
102 {
103     CL_DEVICE_TYPE_DEFAULT                      = (1 << 0),
104     CL_DEVICE_TYPE_CPU                          = (1 << 1),
105     CL_DEVICE_TYPE_GPU                          = (1 << 2),
106     CL_DEVICE_TYPE_ACCELERATOR                  = (1 << 3),
107     CL_DEVICE_TYPE_CUSTOM                       = (1 << 4),
108     CL_DEVICE_TYPE_ALL                          = 0xFFFFFFFF,
109 }
110 
111 // cl_device_info
112 enum
113 {
114     CL_DEVICE_TYPE                              = 0x1000,
115     CL_DEVICE_VENDOR_ID                         = 0x1001,
116     CL_DEVICE_MAX_COMPUTE_UNITS                 = 0x1002,
117     CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS          = 0x1003,
118     CL_DEVICE_MAX_WORK_GROUP_SIZE               = 0x1004,
119     CL_DEVICE_MAX_WORK_ITEM_SIZES               = 0x1005,
120     CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR       = 0x1006,
121     CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT      = 0x1007,
122     CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT        = 0x1008,
123     CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG       = 0x1009,
124     CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT      = 0x100A,
125     CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE     = 0x100B,
126     CL_DEVICE_MAX_CLOCK_FREQUENCY               = 0x100C,
127     CL_DEVICE_ADDRESS_BITS                      = 0x100D,
128     CL_DEVICE_MAX_READ_IMAGE_ARGS               = 0x100E,
129     CL_DEVICE_MAX_WRITE_IMAGE_ARGS              = 0x100F,
130     CL_DEVICE_MAX_MEM_ALLOC_SIZE                = 0x1010,
131     CL_DEVICE_IMAGE2D_MAX_WIDTH                 = 0x1011,
132     CL_DEVICE_IMAGE2D_MAX_HEIGHT                = 0x1012,
133     CL_DEVICE_IMAGE3D_MAX_WIDTH                 = 0x1013,
134     CL_DEVICE_IMAGE3D_MAX_HEIGHT                = 0x1014,
135     CL_DEVICE_IMAGE3D_MAX_DEPTH                 = 0x1015,
136     CL_DEVICE_IMAGE_SUPPORT                     = 0x1016,
137     CL_DEVICE_MAX_PARAMETER_SIZE                = 0x1017,
138     CL_DEVICE_MAX_SAMPLERS                      = 0x1018,
139     CL_DEVICE_MEM_BASE_ADDR_ALIGN               = 0x1019,
140     CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE          = 0x101A, // Deprecated in OpenCl 1.2
141     CL_DEVICE_SINGLE_FP_CONFIG                  = 0x101B,
142     CL_DEVICE_GLOBAL_MEM_CACHE_TYPE             = 0x101C,
143     CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE         = 0x101D,
144     CL_DEVICE_GLOBAL_MEM_CACHE_SIZE             = 0x101E,
145     CL_DEVICE_GLOBAL_MEM_SIZE                   = 0x101F,
146     CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE          = 0x1020,
147     CL_DEVICE_MAX_CONSTANT_ARGS                 = 0x1021,
148     CL_DEVICE_LOCAL_MEM_TYPE                    = 0x1022,
149     CL_DEVICE_LOCAL_MEM_SIZE                    = 0x1023,
150     CL_DEVICE_ERROR_CORRECTION_SUPPORT          = 0x1024,
151     CL_DEVICE_PROFILING_TIMER_RESOLUTION        = 0x1025,
152     CL_DEVICE_ENDIAN_LITTLE                     = 0x1026,
153     CL_DEVICE_AVAILABLE                         = 0x1027,
154     CL_DEVICE_COMPILER_AVAILABLE                = 0x1028,
155     CL_DEVICE_EXECUTION_CAPABILITIES            = 0x1029,
156     CL_DEVICE_QUEUE_PROPERTIES                  = 0x102A,
157     CL_DEVICE_NAME                              = 0x102B,
158     CL_DEVICE_VENDOR                            = 0x102C,
159     CL_DRIVER_VERSION                           = 0x102D,
160     CL_DEVICE_PROFILE                           = 0x102E,
161     CL_DEVICE_VERSION                           = 0x102F,
162     CL_DEVICE_EXTENSIONS                        = 0x1030,
163     CL_DEVICE_PLATFORM                          = 0x1031,
164     CL_DEVICE_DOUBLE_FP_CONFIG                  = 0x1032,
165     // 0x1033 reserved for CL_DEVICE_HALF_FP_CONFIG
166     CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF       = 0x1034,
167     CL_DEVICE_HOST_UNIFIED_MEMORY               = 0x1035,
168     CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR          = 0x1036,
169     CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT         = 0x1037,
170     CL_DEVICE_NATIVE_VECTOR_WIDTH_INT           = 0x1038,
171     CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG          = 0x1039,
172     CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT         = 0x103A,
173     CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE        = 0x103B,
174     CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF          = 0x103C,
175     CL_DEVICE_OPENCL_C_VERSION                  = 0x103D,
176     CL_DEVICE_LINKER_AVAILABLE                  = 0x103E,
177     CL_DEVICE_BUILT_IN_KERNELS                  = 0x103F,
178     CL_DEVICE_IMAGE_MAX_BUFFER_SIZE             = 0x1040,
179     CL_DEVICE_IMAGE_MAX_ARRAY_SIZE              = 0x1041,
180     CL_DEVICE_PARENT_DEVICE                     = 0x1042,
181     CL_DEVICE_PARTITION_MAX_SUB_DEVICES         = 0x1043,
182     CL_DEVICE_PARTITION_PROPERTIES              = 0x1044,
183     CL_DEVICE_PARTITION_AFFINITY_DOMAIN         = 0x1045,
184     CL_DEVICE_PARTITION_TYPE                    = 0x1046,
185     CL_DEVICE_REFERENCE_COUNT                   = 0x1047,
186     CL_DEVICE_PREFERRED_INTEROP_USER_SYNC       = 0x1048,
187     CL_DEVICE_PRINTF_BUFFER_SIZE                = 0x1049,
188 }
189 
190 // cl_device_fp_config
191 enum : cl_bitfield
192 {
193     CL_FP_DENORM                                = (1 << 0),
194     CL_FP_INF_NAN                               = (1 << 1),
195     CL_FP_ROUND_TO_NEAREST                      = (1 << 2),
196     CL_FP_ROUND_TO_ZERO                         = (1 << 3),
197     CL_FP_ROUND_TO_INF                          = (1 << 4),
198     CL_FP_FMA                                   = (1 << 5),
199     CL_FP_SOFT_FLOAT                            = (1 << 6),
200     CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT         = (1 << 7),
201 }
202 
203 // cl_device_mem_cache_type
204 enum
205 {
206     CL_NONE                                     = 0x0,
207     CL_READ_ONLY_CACHE                          = 0x1,
208     CL_READ_WRITE_CACHE                         = 0x2,
209 }
210 
211 // cl_device_local_mem_type
212 enum
213 {
214     CL_LOCAL                                    = 0x1,
215     CL_GLOBAL                                   = 0x2,
216 }
217 
218 // cl_device_exec_capabilities
219 enum : cl_bitfield
220 {
221     CL_EXEC_KERNEL                              = (1 << 0),
222     CL_EXEC_NATIVE_KERNEL                       = (1 << 1),
223 }
224 
225 // cl_command_queue_properties
226 enum : cl_bitfield
227 {
228     CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE      = (1 << 0),
229     CL_QUEUE_PROFILING_ENABLE                   = (1 << 1),
230 }
231 
232 // cl_context_info
233 enum
234 {
235     CL_CONTEXT_REFERENCE_COUNT                  = 0x1080,
236     CL_CONTEXT_DEVICES                          = 0x1081,
237     CL_CONTEXT_PROPERTIES                       = 0x1082,
238     CL_CONTEXT_NUM_DEVICES                      = 0x1083,
239 }
240 
241 // cl_context_properties
242 enum
243 {
244     CL_CONTEXT_PLATFORM                         = 0x1084,
245     CL_CONTEXT_INTEROP_USER_SYNC                = 0x1085,
246 }
247 
248 // cl_device_partition_property
249 enum : ptrdiff_t
250 {
251     CL_DEVICE_PARTITION_EQUALLY                 = 0x1086,
252     CL_DEVICE_PARTITION_BY_COUNTS               = 0x1087,
253     CL_DEVICE_PARTITION_BY_COUNTS_LIST_END      = 0x0,
254     CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN      = 0x1088,
255 }
256 
257 // cl_device_affinity_domain
258 enum : cl_bitfield
259 {
260     CL_DEVICE_AFFINITY_DOMAIN_NUMA               = (1 << 0),
261     CL_DEVICE_AFFINITY_DOMAIN_L4_CACHE           = (1 << 1),
262     CL_DEVICE_AFFINITY_DOMAIN_L3_CACHE           = (1 << 2),
263     CL_DEVICE_AFFINITY_DOMAIN_L2_CACHE           = (1 << 3),
264     CL_DEVICE_AFFINITY_DOMAIN_L1_CACHE           = (1 << 4),
265     CL_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE = (1 << 5),
266 }
267 
268 // cl_command_queue_info
269 enum
270 {
271     CL_QUEUE_CONTEXT                            = 0x1090,
272     CL_QUEUE_DEVICE                             = 0x1091,
273     CL_QUEUE_REFERENCE_COUNT                    = 0x1092,
274     CL_QUEUE_PROPERTIES                         = 0x1093,
275 }
276 
277 // cl_mem_flags - bitfield
278 enum : cl_bitfield
279 {
280     CL_MEM_READ_WRITE                           = (1 << 0),
281     CL_MEM_WRITE_ONLY                           = (1 << 1),
282     CL_MEM_READ_ONLY                            = (1 << 2),
283     CL_MEM_USE_HOST_PTR                         = (1 << 3),
284     CL_MEM_ALLOC_HOST_PTR                       = (1 << 4),
285     CL_MEM_COPY_HOST_PTR                        = (1 << 5),
286 // reserved                                     = (1 << 6),
287     CL_MEM_HOST_WRITE_ONLY                      = (1 << 7),
288     CL_MEM_HOST_READ_ONLY                       = (1 << 8),
289     CL_MEM_HOST_NO_ACCESS                       = (1 << 9),
290 }
291 
292 // cl_mem_migration_flags
293 enum : cl_bitfield
294 {
295     CL_MIGRATE_MEM_OBJECT_HOST                  = (1 << 0),
296     CL_MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED     = (1 << 1),
297 }
298 
299 // cl_channel_order
300 enum
301 {
302     CL_R                                        = 0x10B0,
303     CL_A                                        = 0x10B1,
304     CL_RG                                       = 0x10B2,
305     CL_RA                                       = 0x10B3,
306     CL_RGB                                      = 0x10B4,
307     CL_RGBA                                     = 0x10B5,
308     CL_BGRA                                     = 0x10B6,
309     CL_ARGB                                     = 0x10B7,
310     CL_INTENSITY                                = 0x10B8,
311     CL_LUMINANCE                                = 0x10B9,
312     CL_Rx                                       = 0x10BA,
313     CL_RGx                                      = 0x10BB,
314     CL_RGBx                                     = 0x10BC,
315     CL_DEPTH                                    = 0x10BD,
316     CL_DEPTH_STENCIL                            = 0x10BE,
317 }
318 
319 // cl_channel_type
320 enum
321 {
322     CL_SNORM_INT8                               = 0x10D0,
323     CL_SNORM_INT16                              = 0x10D1,
324     CL_UNORM_INT8                               = 0x10D2,
325     CL_UNORM_INT16                              = 0x10D3,
326     CL_UNORM_SHORT_565                          = 0x10D4,
327     CL_UNORM_SHORT_555                          = 0x10D5,
328     CL_UNORM_INT_101010                         = 0x10D6,
329     CL_SIGNED_INT8                              = 0x10D7,
330     CL_SIGNED_INT16                             = 0x10D8,
331     CL_SIGNED_INT32                             = 0x10D9,
332     CL_UNSIGNED_INT8                            = 0x10DA,
333     CL_UNSIGNED_INT16                           = 0x10DB,
334     CL_UNSIGNED_INT32                           = 0x10DC,
335     CL_HALF_FLOAT                               = 0x10DD,
336     CL_FLOAT                                    = 0x10DE,
337     CL_UNORM_INT24                              = 0x10DF,
338 }
339 
340 // cl_mem_object_type
341 enum
342 {
343     CL_MEM_OBJECT_BUFFER                        = 0x10F0,
344     CL_MEM_OBJECT_IMAGE2D                       = 0x10F1,
345     CL_MEM_OBJECT_IMAGE3D                       = 0x10F2,
346     CL_MEM_OBJECT_IMAGE2D_ARRAY                 = 0x10F3,
347     CL_MEM_OBJECT_IMAGE1D                       = 0x10F4,
348     CL_MEM_OBJECT_IMAGE1D_ARRAY                 = 0x10F5,
349     CL_MEM_OBJECT_IMAGE1D_BUFFER                = 0x10F6,
350 }
351 
352 // cl_mem_info
353 enum
354 {
355     CL_MEM_TYPE                                 = 0x1100,
356     CL_MEM_FLAGS                                = 0x1101,
357     CL_MEM_SIZE                                 = 0x1102,
358     CL_MEM_HOST_PTR                             = 0x1103,
359     CL_MEM_MAP_COUNT                            = 0x1104,
360     CL_MEM_REFERENCE_COUNT                      = 0x1105,
361     CL_MEM_CONTEXT                              = 0x1106,
362     CL_MEM_ASSOCIATED_MEMOBJECT                 = 0x1107,
363     CL_MEM_OFFSET                               = 0x1108,
364 }
365 
366 // cl_image_info
367 enum
368 {
369     CL_IMAGE_FORMAT                             = 0x1110,
370     CL_IMAGE_ELEMENT_SIZE                       = 0x1111,
371     CL_IMAGE_ROW_PITCH                          = 0x1112,
372     CL_IMAGE_SLICE_PITCH                        = 0x1113,
373     CL_IMAGE_WIDTH                              = 0x1114,
374     CL_IMAGE_HEIGHT                             = 0x1115,
375     CL_IMAGE_DEPTH                              = 0x1116,
376     CL_IMAGE_ARRAY_SIZE                         = 0x1117,
377     CL_IMAGE_BUFFER                             = 0x1118,
378     CL_IMAGE_NUM_MIP_LEVELS                     = 0x1119,
379     CL_IMAGE_NUM_SAMPLES                        = 0x111A,
380 }
381 
382 // cl_addressing_mode
383 enum
384 {
385     CL_ADDRESS_NONE                             = 0x1130,
386     CL_ADDRESS_CLAMP_TO_EDGE                    = 0x1131,
387     CL_ADDRESS_CLAMP                            = 0x1132,
388     CL_ADDRESS_REPEAT                           = 0x1133,
389     CL_ADDRESS_MIRRORED_REPEAT                  = 0x1134,
390 }
391 
392 // cl_filter_mode
393 enum
394 {
395     CL_FILTER_NEAREST                           = 0x1140,
396     CL_FILTER_LINEAR                            = 0x1141,
397 }
398 
399 // cl_sampler_info
400 enum
401 {
402     CL_SAMPLER_REFERENCE_COUNT                  = 0x1150,
403     CL_SAMPLER_CONTEXT                          = 0x1151,
404     CL_SAMPLER_NORMALIZED_COORDS                = 0x1152,
405     CL_SAMPLER_ADDRESSING_MODE                  = 0x1153,
406     CL_SAMPLER_FILTER_MODE                      = 0x1154,
407 }
408 
409 // cl_map_flags - bitfield
410 enum : cl_bitfield
411 {
412     CL_MAP_READ                                 = (1 << 0),
413     CL_MAP_WRITE                                = (1 << 1),
414     CL_MAP_WRITE_INVALIDATE_REGION              = (1 << 2),
415 }
416 
417 // cl_program_info
418 enum
419 {
420     CL_PROGRAM_REFERENCE_COUNT                  = 0x1160,
421     CL_PROGRAM_CONTEXT                          = 0x1161,
422     CL_PROGRAM_NUM_DEVICES                      = 0x1162,
423     CL_PROGRAM_DEVICES                          = 0x1163,
424     CL_PROGRAM_SOURCE                           = 0x1164,
425     CL_PROGRAM_BINARY_SIZES                     = 0x1165,
426     CL_PROGRAM_BINARIES                         = 0x1166,
427     CL_PROGRAM_NUM_KERNELS                      = 0x1167,
428     CL_PROGRAM_KERNEL_NAMES                     = 0x1168,
429 }
430 
431 // cl_program_build_info
432 enum
433 {
434     CL_PROGRAM_BUILD_STATUS                     = 0x1181,
435     CL_PROGRAM_BUILD_OPTIONS                    = 0x1182,
436     CL_PROGRAM_BUILD_LOG                        = 0x1183,
437     CL_PROGRAM_BINARY_TYPE                      = 0x1184,
438 }
439 
440 // cl_program_binary_type
441 enum
442 {
443     CL_PROGRAM_BINARY_TYPE_NONE                 = 0x0,
444     CL_PROGRAM_BINARY_TYPE_COMPILED_OBJECT      = 0x1,
445     CL_PROGRAM_BINARY_TYPE_LIBRARY              = 0x2,
446     CL_PROGRAM_BINARY_TYPE_EXECUTABLE           = 0x4,
447 }
448 
449 // cl_build_status
450 enum
451 {
452     CL_BUILD_SUCCESS                            =  0,
453     CL_BUILD_NONE                               = -1,
454     CL_BUILD_ERROR                              = -2,
455     CL_BUILD_IN_PROGRESS                        = -3,
456 }
457 
458 // cl_kernel_info
459 enum
460 {
461     CL_KERNEL_FUNCTION_NAME                     = 0x1190,
462     CL_KERNEL_NUM_ARGS                          = 0x1191,
463     CL_KERNEL_REFERENCE_COUNT                   = 0x1192,
464     CL_KERNEL_CONTEXT                           = 0x1193,
465     CL_KERNEL_PROGRAM                           = 0x1194,
466     CL_KERNEL_ATTRIBUTES                        = 0x1195,
467 }
468 
469 // cl_kernel_arg_info
470 enum
471 {
472     CL_KERNEL_ARG_ADDRESS_QUALIFIER             = 0x1196,
473     CL_KERNEL_ARG_ACCESS_QUALIFIER              = 0x1197,
474     CL_KERNEL_ARG_TYPE_NAME                     = 0x1198,
475     CL_KERNEL_ARG_TYPE_QUALIFIER                = 0x1199,
476     CL_KERNEL_ARG_NAME                          = 0x119A,
477 }
478 
479 // cl_kernel_arg_address_qualifier
480 enum
481 {
482     CL_KERNEL_ARG_ADDRESS_GLOBAL                = 0x119B,
483     CL_KERNEL_ARG_ADDRESS_LOCAL                 = 0x119C,
484     CL_KERNEL_ARG_ADDRESS_CONSTANT              = 0x119D,
485     CL_KERNEL_ARG_ADDRESS_PRIVATE               = 0x119E,
486 }
487 
488 // cl_kernel_arg_access_qualifier
489 enum
490 {
491     CL_KERNEL_ARG_ACCESS_READ_ONLY              = 0x11A0,
492     CL_KERNEL_ARG_ACCESS_WRITE_ONLY             = 0x11A1,
493     CL_KERNEL_ARG_ACCESS_READ_WRITE             = 0x11A2,
494     CL_KERNEL_ARG_ACCESS_NONE                   = 0x11A3,
495 }
496 
497 // cl_kernel_arg_type_qualifer
498 enum : cl_bitfield
499 {
500     CL_KERNEL_ARG_TYPE_NONE                     = 0,
501     CL_KERNEL_ARG_TYPE_CONST                    = (1 << 0),
502     CL_KERNEL_ARG_TYPE_RESTRICT                 = (1 << 1),
503     CL_KERNEL_ARG_TYPE_VOLATILE                 = (1 << 2),
504 }
505 
506 // cl_kernel_work_group_info
507 enum
508 {
509     CL_KERNEL_WORK_GROUP_SIZE                   = 0x11B0,
510     CL_KERNEL_COMPILE_WORK_GROUP_SIZE           = 0x11B1,
511     CL_KERNEL_LOCAL_MEM_SIZE                    = 0x11B2,
512     CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE= 0x11B3,
513     CL_KERNEL_PRIVATE_MEM_SIZE                  = 0x11B4,
514     CL_KERNEL_GLOBAL_WORK_SIZE                  = 0x11B5,
515 }
516 
517 // cl_event_info
518 enum
519 {
520     CL_EVENT_COMMAND_QUEUE                      = 0x11D0,
521     CL_EVENT_COMMAND_TYPE                       = 0x11D1,
522     CL_EVENT_REFERENCE_COUNT                    = 0x11D2,
523     CL_EVENT_COMMAND_EXECUTION_STATUS           = 0x11D3,
524     CL_EVENT_CONTEXT                            = 0x11D4,
525 }
526 
527 // cl_command_type
528 enum
529 {
530     CL_COMMAND_NDRANGE_KERNEL                   = 0x11F0,
531     CL_COMMAND_TASK                             = 0x11F1,
532     CL_COMMAND_NATIVE_KERNEL                    = 0x11F2,
533     CL_COMMAND_READ_BUFFER                      = 0x11F3,
534     CL_COMMAND_WRITE_BUFFER                     = 0x11F4,
535     CL_COMMAND_COPY_BUFFER                      = 0x11F5,
536     CL_COMMAND_READ_IMAGE                       = 0x11F6,
537     CL_COMMAND_WRITE_IMAGE                      = 0x11F7,
538     CL_COMMAND_COPY_IMAGE                       = 0x11F8,
539     CL_COMMAND_COPY_IMAGE_TO_BUFFER             = 0x11F9,
540     CL_COMMAND_COPY_BUFFER_TO_IMAGE             = 0x11FA,
541     CL_COMMAND_MAP_BUFFER                       = 0x11FB,
542     CL_COMMAND_MAP_IMAGE                        = 0x11FC,
543     CL_COMMAND_UNMAP_MEM_OBJECT                 = 0x11FD,
544     CL_COMMAND_MARKER                           = 0x11FE,
545     CL_COMMAND_ACQUIRE_GL_OBJECTS               = 0x11FF,
546     CL_COMMAND_RELEASE_GL_OBJECTS               = 0x1200,
547     CL_COMMAND_READ_BUFFER_RECT                 = 0x1201,
548     CL_COMMAND_WRITE_BUFFER_RECT                = 0x1202,
549     CL_COMMAND_COPY_BUFFER_RECT                 = 0x1203,
550     CL_COMMAND_USER                             = 0x1204,
551     CL_COMMAND_BARRIER                          = 0x1205,
552     CL_COMMAND_MIGRATE_MEM_OBJECTS              = 0x1206,
553     CL_COMMAND_FILL_BUFFER                      = 0x1207,
554     CL_COMMAND_FILL_IMAGE                       = 0x1208,
555 }
556 
557 // cl_command_execution_status
558 enum
559 {
560     CL_COMPLETE                                 = 0x0,
561     CL_RUNNING                                  = 0x1,
562     CL_SUBMITTED                                = 0x2,
563     CL_QUEUED                                   = 0x3,
564 }
565 
566 // cl_buffer_create_type
567 enum
568 {
569     CL_BUFFER_CREATE_TYPE_REGION                = 0x1220,
570 }
571 
572 // cl_profiling_info
573 enum
574 {
575     CL_PROFILING_COMMAND_QUEUED                 = 0x1280,
576     CL_PROFILING_COMMAND_SUBMIT                 = 0x1281,
577     CL_PROFILING_COMMAND_START                  = 0x1282,
578     CL_PROFILING_COMMAND_END                    = 0x1283,
579 }
580 
581 
582 // cl_ext.h
583 
584 // cl_khr_fp16 extension
585 enum CL_DEVICE_HALF_FP_CONFIG                   = 0x1033;
586 
587 // cl_APPLE_SetMemObjectDestructor extension
588 enum cl_APPLE_SetMemObjectDestructor            = 1;
589 
590 // cl_APPLE_ContextLoggingFunctions
591 enum cl_APPLE_ContextLoggingFunctions           = 1;
592 
593 // cl_khr_icd extension
594 enum cl_khr_icd                                 = 1;
595 // cl_platform_info
596 enum CL_PLATFORM_ICD_SUFFIX_KHR                 = 0x0920;
597 // Additional Error Codes
598 enum CL_PLATFORM_NOT_FOUND_KHR                  = -1001;
599 
600 // cl_khr_initalize_memory extension
601 enum CL_CONTEXT_MEMORY_INITIALIZE_KHR           = 0x200E;
602 
603 // cl_khr_terminate_context extension
604 enum cl_khr_terminate_context                   = 1;
605 enum
606 {
607     CL_DEVICE_TERMINATE_CAPABILITY_KHR          = 0x200F,
608     CL_CONTEXT_TERMINATE_KHR                    = 0x2010,
609 }
610 
611 // cl_nv_device_attribute_query extension
612 enum
613 {
614     CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV       = 0x4000,
615     CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV       = 0x4001,
616     CL_DEVICE_REGISTERS_PER_BLOCK_NV            = 0x4002,
617     CL_DEVICE_WARP_SIZE_NV                      = 0x4003,
618     CL_DEVICE_GPU_OVERLAP_NV                    = 0x4004,
619     CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV            = 0x4005,
620     CL_DEVICE_INTEGRATED_MEMORY_NV              = 0x4006,
621 }
622 
623 // cl_amd_device_attribute_query extension
624 enum CL_DEVICE_PROFILING_TIMER_OFFSET_AMD       = 0x4036;
625 
626 // cl_ext_device_fission extension
627 enum cl_ext_device_fission                      = 1;
628 
629 // cl_device_partition_property_ext extension
630 enum
631 {
632     CL_DEVICE_PARTITION_EQUALLY_EXT             = 0x4050,
633     CL_DEVICE_PARTITION_BY_COUNTS_EXT           = 0x4051,
634     CL_DEVICE_PARTITION_BY_NAMES_EXT            = 0x4052,
635     CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN_EXT  = 0x4053,
636 }
637 
638 // clDeviceGetInfo selectors
639 enum
640 {
641     CL_DEVICE_PARENT_DEVICE_EXT                 = 0x4054,
642     CL_DEVICE_PARTITION_TYPES_EXT               = 0x4055,
643     CL_DEVICE_AFFINITY_DOMAINS_EXT              = 0x4056,
644     CL_DEVICE_REFERENCE_COUNT_EXT               = 0x4057,
645     CL_DEVICE_PARTITION_STYLE_EXT               = 0x4058,
646 }
647 
648 // error codes
649 enum
650 {
651     CL_DEVICE_PARTITION_FAILED_EXT              = -1057,
652     CL_INVALID_PARTITION_COUNT_EXT              = -1058,
653     CL_INVALID_PARTITION_NAME_EXT               = -1059,
654 }
655 
656 // CL_AFFINITY_DOMAINs
657 enum
658 {
659     CL_AFFINITY_DOMAIN_L1_CACHE_EXT             = 0x1,
660     CL_AFFINITY_DOMAIN_L2_CACHE_EXT             = 0x2,
661     CL_AFFINITY_DOMAIN_L3_CACHE_EXT             = 0x3,
662     CL_AFFINITY_DOMAIN_L4_CACHE_EXT             = 0x4,
663     CL_AFFINITY_DOMAIN_NUMA_EXT                 = 0x10,
664     CL_AFFINITY_DOMAIN_NEXT_FISSIONABLE_EXT     = 0x100,
665 }
666 
667 // cl_device_partition_property_ext list terminators
668 enum
669 {
670     CL_PROPERTIES_LIST_END_EXT                  = (cast(cl_device_partition_property_ext) 0),
671     CL_PARTITION_BY_COUNTS_LIST_END_EXT         = (cast(cl_device_partition_property_ext) 0),
672     CL_PARTITION_BY_NAMES_LIST_END_EXT          = (cast(cl_device_partition_property_ext) 0 - 1),
673 }
674 
675 
676 // cl_egl.h
677 
678 // Command type for events created with clEnqueueAcquireEGLObjectsKHR
679 enum
680 {
681     CL_COMMAND_EGL_FENCE_SYNC_OBJECT_KHR        = 0x202F,
682     CL_COMMAND_ACQUIRE_EGL_OBJECTS_KHR          = 0x202D,
683     CL_COMMAND_RELEASE_EGL_OBJECTS_KHR          = 0x202E,
684 }
685 
686 // Error type for clCreateFromEGLImageKHR
687 enum
688 {
689     CL_INVALID_EGL_OBJECT_KHR                   = -1093,
690     CL_EGL_RESOURCE_NOT_ACQUIRED_KHR            = -1092,
691 }
692 
693 // cl_khr_egl_image extension
694 enum cl_khr_egl_image                           = 1;
695 
696 // cl_khr_egl_event extension
697 enum cl_khr_egl_event                           = 1;
698 
699 
700 // cl_gl.h
701 
702 // cl_gl_object_type
703 enum
704 {
705     CL_GL_OBJECT_BUFFER                         = 0x2000,
706     CL_GL_OBJECT_TEXTURE2D                      = 0x2001,
707     CL_GL_OBJECT_TEXTURE3D                      = 0x2002,
708     CL_GL_OBJECT_RENDERBUFFER                   = 0x2003,
709     CL_GL_OBJECT_TEXTURE2D_ARRAY                = 0x200E,
710     CL_GL_OBJECT_TEXTURE1D                      = 0x200F,
711     CL_GL_OBJECT_TEXTURE1D_ARRAY                = 0x2010,
712     CL_GL_OBJECT_TEXTURE_BUFFER                 = 0x2011,
713 }
714 
715 // cl_gl_texture_info
716 enum
717 {
718     CL_GL_TEXTURE_TARGET                        = 0x2004,
719     CL_GL_MIPMAP_LEVEL                          = 0x2005,
720     CL_GL_NUM_SAMPLES                           = 0x2012,
721 }
722 
723 // Additional Error Codes
724 enum CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR     = -1000;
725 
726 // cl_gl_context_info
727 enum
728 {
729     CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR        = 0x2006,
730     CL_DEVICES_FOR_GL_CONTEXT_KHR               = 0x2007,
731 }
732 
733 // Additional cl_context_properties
734 enum
735 {
736     CL_GL_CONTEXT_KHR                           = 0x2008,
737     CL_EGL_DISPLAY_KHR                          = 0x2009,
738     CL_GLX_DISPLAY_KHR                          = 0x200A,
739     CL_WGL_HDC_KHR                              = 0x200B,
740     CL_CGL_SHAREGROUP_KHR                       = 0x200C,
741 }
742 
743 // cl_khr_gl_sharing extension
744 enum cl_khr_gl_sharing                          = 1;
745 
746 
747 // cl_gl_ext.h
748 
749 // cl_khr_gl_event extension
750 enum CL_COMMAND_GL_FENCE_SYNC_OBJECT_KHR        = 0x200D;
751 
752 
753 // cl_d3d10.h
754 
755 // cl_khr_d3d10_sharing extension
756 enum cl_khr_d3d10_sharing                           = 1;
757 
758 // Error Codes
759 enum
760 {
761     CL_INVALID_D3D10_DEVICE_KHR                     = -1002,
762     CL_INVALID_D3D10_RESOURCE_KHR                   = -1003,
763     CL_D3D10_RESOURCE_ALREADY_ACQUIRED_KHR          = -1004,
764     CL_D3D10_RESOURCE_NOT_ACQUIRED_KHR              = -1005,
765 }
766 
767 // cl_d3d10_device_source_nv
768 enum
769 {
770     CL_D3D10_DEVICE_KHR                             = 0x4010,
771     CL_D3D10_DXGI_ADAPTER_KHR                       = 0x4011,
772 }
773 
774 // cl_d3d10_device_set_nv
775 enum
776 {
777     CL_PREFERRED_DEVICES_FOR_D3D10_KHR              = 0x4012,
778     CL_ALL_DEVICES_FOR_D3D10_KHR                    = 0x4013,
779 }
780 
781 // cl_context_info
782 enum
783 {
784     CL_CONTEXT_D3D10_DEVICE_KHR                     = 0x4014,
785     CL_CONTEXT_D3D10_PREFER_SHARED_RESOURCES_KHR    = 0x402C,
786 }
787 
788 // cl_mem_info
789 enum CL_MEM_D3D10_RESOURCE_KHR                      = 0x4015;
790 
791 // cl_image_info
792 enum CL_IMAGE_D3D10_SUBRESOURCE_KHR                 = 0x4016;
793 
794 // cl_command_type
795 enum CL_COMMAND_ACQUIRE_D3D10_OBJECTS_KHR           = 0x4017;
796 enum CL_COMMAND_RELEASE_D3D10_OBJECTS_KHR           = 0x4018;
797 
798 
799 // cl_d3d11.h
800 
801 // cl_khr_d3d11_sharing extension
802 enum cl_khr_d3d11_sharing = 1;
803 
804 // Error Codes
805 enum
806 {
807     CL_INVALID_D3D11_DEVICE_KHR                     = -1006,
808     CL_INVALID_D3D11_RESOURCE_KHR                   = -1007,
809     CL_D3D11_RESOURCE_ALREADY_ACQUIRED_KHR          = -1008,
810     CL_D3D11_RESOURCE_NOT_ACQUIRED_KHR              = -1009,
811 }
812 
813 // cl_d3d11_device_source
814 enum
815 {
816     CL_D3D11_DEVICE_KHR                             = 0x4019,
817     CL_D3D11_DXGI_ADAPTER_KHR                       = 0x401A,
818 }
819 
820 // cl_d3d11_device_set
821 enum
822 {
823     CL_PREFERRED_DEVICES_FOR_D3D11_KHR              = 0x401B,
824     CL_ALL_DEVICES_FOR_D3D11_KHR                    = 0x401C,
825 }
826 
827 // cl_context_info
828 enum
829 {
830     CL_CONTEXT_D3D11_DEVICE_KHR                     = 0x401D,
831     CL_CONTEXT_D3D11_PREFER_SHARED_RESOURCES_KHR    = 0x402D,
832 }
833 
834 // cl_mem_info
835 enum CL_MEM_D3D11_RESOURCE_KHR                      = 0x401E;
836 
837 // cl_image_info
838 enum CL_IMAGE_D3D11_SUBRESOURCE_KHR                 = 0x401F;
839 
840 // cl_command_type
841 enum
842 {
843     CL_COMMAND_ACQUIRE_D3D11_OBJECTS_KHR            = 0x4020,
844     CL_COMMAND_RELEASE_D3D11_OBJECTS_KHR            = 0x4021,
845 }
846 
847 
848 // cl_dx9_media_sharing.h extension
849 
850 // cl_khr_dx9_media_sharing
851 enum cl_khr_dx9_media_sharing                       = 1;
852 
853 // Error Codes
854 enum
855 {
856     CL_INVALID_DX9_MEDIA_ADAPTER_KHR                = -1010,
857     CL_INVALID_DX9_MEDIA_SURFACE_KHR                = -1011,
858     CL_DX9_MEDIA_SURFACE_ALREADY_ACQUIRED_KHR       = -1012,
859     CL_DX9_MEDIA_SURFACE_NOT_ACQUIRED_KHR           = -1013,
860 }
861 
862 // cl_media_adapter_type_khr
863 enum
864 {
865     CL_ADAPTER_D3D9_KHR                             = 0x2020,
866     CL_ADAPTER_D3D9EX_KHR                           = 0x2021,
867     CL_ADAPTER_DXVA_KHR                             = 0x2022,
868 }
869 
870 // cl_media_adapter_set_khr
871 enum
872 {
873     CL_PREFERRED_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR  = 0x2023,
874     CL_ALL_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR        = 0x2024,
875 }
876 
877 // cl_context_info
878 enum
879 {
880     CL_CONTEXT_ADAPTER_D3D9_KHR                     = 0x2025,
881     CL_CONTEXT_ADAPTER_D3D9EX_KHR                   = 0x2026,
882     CL_CONTEXT_ADAPTER_DXVA_KHR                     = 0x2027,
883 }
884 
885 // cl_mem_info
886 enum
887 {
888     CL_MEM_DX9_MEDIA_ADAPTER_TYPE_KHR               = 0x2028,
889     CL_MEM_DX9_MEDIA_SURFACE_INFO_KHR               = 0x2029,
890 }
891 
892 // cl_image_info
893 enum CL_IMAGE_DX9_MEDIA_PLANE_KHR                   = 0x202A;
894 
895 // cl_command_type
896 enum
897 {
898     CL_COMMAND_ACQUIRE_DX9_MEDIA_SURFACES_KHR       = 0x202B,
899     CL_COMMAND_RELEASE_DX9_MEDIA_SURFACES_KHR       = 0x202C,
900 }
901 
902 
903 // cl_platform.h
904 
905 /* Macro names and corresponding values defined by OpenCL */
906 enum CL_CHAR_BIT         = 8;
907 enum CL_SCHAR_MAX        = 127;
908 enum CL_SCHAR_MIN        = (-127-1);
909 enum CL_CHAR_MAX         = CL_SCHAR_MAX;
910 enum CL_CHAR_MIN         = CL_SCHAR_MIN;
911 enum CL_UCHAR_MAX        = 255;
912 enum CL_SHRT_MAX         = 32767;
913 enum CL_SHRT_MIN         = (-32767-1);
914 enum CL_USHRT_MAX        = 65535;
915 enum CL_INT_MAX          = 2147483647;
916 enum CL_INT_MIN          = (-2147483647-1);
917 enum CL_UINT_MAX         = 0xffffffffU;
918 enum CL_LONG_MAX         = (cast(cl_long) 0x7FFFFFFFFFFFFFFF);
919 enum CL_LONG_MIN         = (cast(cl_long) -0x7FFFFFFFFFFFFFFF - 1);
920 enum CL_ULONG_MAX        = (cast(cl_ulong) 0xFFFFFFFFFFFFFFFF);
921 
922 enum CL_FLT_DIG          = 6;
923 enum CL_FLT_MANT_DIG     = 24;
924 enum CL_FLT_MAX_10_EXP   = +38;
925 enum CL_FLT_MAX_EXP      = +128;
926 enum CL_FLT_MIN_10_EXP   = -37;
927 enum CL_FLT_MIN_EXP      = -125;
928 enum CL_FLT_RADIX        = 2;
929 
930 enum CL_FLT_MAX          = float.max;
931 enum CL_FLT_MIN          = float.min_normal;
932 enum CL_FLT_EPSILON      = 0x1.0p-23f;
933 
934 enum CL_DBL_DIG          = 15;
935 enum CL_DBL_MANT_DIG     = 53;
936 enum CL_DBL_MAX_10_EXP   = +308;
937 enum CL_DBL_MAX_EXP      = +1024;
938 enum CL_DBL_MIN_10_EXP   = -307;
939 enum CL_DBL_MIN_EXP      = -1021;
940 enum CL_DBL_RADIX        = 2;
941 
942 enum CL_DBL_MAX      = double.max;
943 enum CL_DBL_MIN      = double.min_normal;
944 enum CL_DBL_EPSILON  = double.epsilon;
945 
946 enum CL_M_E             = 2.718281828459045090796;
947 enum CL_M_LOG2E         = 1.442695040888963387005;
948 enum CL_M_LOG10E        = 0.434294481903251816668;
949 enum CL_M_LN2           = 0.693147180559945286227;
950 enum CL_M_LN10          = 2.302585092994045901094;
951 enum CL_M_PI            = 3.141592653589793115998;
952 enum CL_M_PI_2          = 1.570796326794896557999;
953 enum CL_M_PI_4          = 0.785398163397448278999;
954 enum CL_M_1_PI          = 0.318309886183790691216;
955 enum CL_M_2_PI          = 0.636619772367581382433;
956 enum CL_M_2_SQRTPI      = 1.128379167095512558561;
957 enum CL_M_SQRT2         = 1.414213562373095145475;
958 enum CL_M_SQRT1_2       = 0.707106781186547572737;
959 
960 enum CL_M_E_F           = 2.71828174591064f;
961 enum CL_M_LOG2E_F       = 1.44269502162933f;
962 enum CL_M_LOG10E_F      = 0.43429449200630f;
963 enum CL_M_LN2_F         = 0.69314718246460f;
964 enum CL_M_LN10_F        = 2.30258512496948f;
965 enum CL_M_PI_F          = 3.14159274101257f;
966 enum CL_M_PI_2_F        = 1.57079637050629f;
967 enum CL_M_PI_4_F        = 0.78539818525314f;
968 enum CL_M_1_PI_F        = 0.31830987334251f;
969 enum CL_M_2_PI_F        = 0.63661974668503f;
970 enum CL_M_2_SQRTPI_F    = 1.12837922573090f;
971 enum CL_M_SQRT2_F       = 1.41421353816986f;
972 enum CL_M_SQRT1_2_F     = 0.70710676908493f;
973 
974 enum CL_NAN             = cl_float.nan;
975 enum CL_HUGE_VALF       = cl_float.infinity;
976 enum CL_HUGE_VAL        = cl_double.infinity;
977 enum CL_MAXFLOAT        = CL_FLT_MAX;
978 enum CL_INFINITY        = CL_HUGE_VALF;
979 
980 
981 // generate code for the CL vector types
982 // this might look crazy, but eases further changes
983 // do a pragma(msg, genCLVectorTypes()); for debugging
984 import std.conv;
985 version(GNU) import gcc.attribute;
986 
987 // TODO: finish compiler-specific vector types, e.g. __attribute__((vector_size(16))); for GDC
988 // TODO: CPU instruction sets-specific alignment (MMX, SSE*, AVX)
989 private string genCLVectorTypes()
990 {
991     string res;
992     foreach(type; ["cl_char", "cl_uchar", "cl_short", "cl_ushort", "cl_int", "cl_uint", "cl_long", "cl_ulong", "cl_float", "cl_double"])
993     {
994         res ~= "alias " ~ type ~ "4 " ~ type ~ "3;"; // cl_xx3 is identical in size, alignment and behavior to cl_xx4. See section 6.1.5. of the spec
995         // now add the rest of the types
996         foreach (size; [2,4,8,16])
997         {
998             res ~= `
999 union ` ~ type ~ to!string(size) ~ `
1000 {
1001     `;
1002     // add aligned attribute if inside GDC
1003     version(GNU) res ~= `@attribute("aligned", (` ~ to!string(size) ~ ` * ` ~ type ~ `.sizeof).to!string) `;
1004     res ~= type ~ "[" ~ to!string(size) ~ `] s;
1005     alias s this; // allow array access and implicit conversion to the array
1006     struct { ` ~ type ~ ` x, y` ~ (size<=2 ? "" : ", z, w") ~ (size>=16 ? ", __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf" : "") ~ `; }
1007     struct { ` ~ type ~ ` s0, s1` ~ (size<=2 ? "" : ", s2, s3") ~ (size>=8 ? ", s4, s5, s6, s7" : "") ~ (size>=16 ? ", s8, s9, sA, sB, sC, sD, sE, sF" : "") ~ `; }
1008     struct { ` ~ type ~ (size>2 ? to!string(size/2) : "") ~ ` lo, hi; }`;
1009     version(GNU) res ~= `
1010     @attribute("vector_size", (` ~ to!string(size) ~ ` * ` ~ type ~ `.sizeof).to!string) ` ~ type ~ " v" ~ to!string(size) ~ `;`;
1011     res ~= `
1012 }
1013 `;
1014         }
1015     }
1016 
1017     return res;
1018 }
1019 
1020 //pragma(msg, genCLVectorTypes());
1021 mixin(genCLVectorTypes());
1022 // NOTE: There are no vector types for half
1023 
1024 
1025 /**
1026  * Macro to facilitate debugging
1027  * Usage:
1028  *   Place mixin(CL_PROGRAM_STRING_DEBUG_INFO) on the line before the first line of your source.
1029  *   The first line ends with:   CL_PROGRAM_STRING_BEGIN \"
1030  *   Each line thereafter of OpenCL C source must have a line end
1031  *   The last line is empty;
1032  *
1033  *   Example:
1034  *
1035  *   string code = mixin(CL_PROGRAM_STRING_DEBUG_INFO) ~ q{
1036  *   kernel void foo( int a, float * b )
1037  *   {
1038  *      // my comment
1039  *      *b[ get_global_id(0)] = a;
1040  *   }
1041  *   };
1042  *
1043  * This should correctly set up the line, (column) and file information for your source
1044  * string so you can do source level debugging.
1045  */
1046 
1047 // Workaround: OpenCL expects Linux dir separators ("unrecognized character escape sequence")
1048 // Usage: createProgram( CL_PROGRAM_STRING_DEBUG_INFO(__LINE__, __FILE__) ~ q{ __kernel code });
1049 import std..string;
1050 
1051 string CL_PROGRAM_STRING_DEBUG_INFO(size_t line = __LINE__, string file = __FILE__)
1052 {
1053     string ret = "";
1054 
1055     debug
1056     {
1057         file = tr(file, "\\", "/");
1058         ret = "#line " ~ to!string(line) ~ " \"" ~ file ~ "\"" ~ "\n\n";
1059     }
1060 
1061     return ret;
1062 }